﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using DevComponents.DotNetBar;
using BusinessLogicLayer;
using Entities;
using DataAccessLayer;
using System.Data.OleDb;
using QuanLyTKB_TienDoGD.In;

namespace QuanLyTKB_TienDoGD.QuanLyTKB
{
    public partial class frmThoiKhoaBieu : Form
    {
        private IRepository<ThoiKhoaBieu> _repository;

        List<ThoiKhoaBieu> ds = new List<ThoiKhoaBieu>();
        ThoiKhoaBieu ql;

        private ThoiKhoaBieuManager _manager;

        string url = "";


        public frmThoiKhoaBieu()
        {
            InitializeComponent();
        }


        private void frmThoiKhoaBieu_Load(object sender, EventArgs e)
        {
            btnLamMoi.PerformClick();
        }

        //Nút load lại toàn bộ dữ liệu
        private void btnLamMoi_Click(object sender, EventArgs e)
        {        
            _repository = new Repository<ThoiKhoaBieu>();
            
            _manager = new ThoiKhoaBieuManager(_repository);

            ds = ThoiKhoaBieu.Repository.GetAll().ToList();

            dgvTKB.DataSource = ds;
        }


        //Hàm sử lý sự kiện thêm
        private void btnThem_Click(object sender, EventArgs e)
        {
            frmThemTKB frm = new frmThemTKB(_manager, this);

            frm.Text = "Tạo Thời Khóa Biểu";
            frm.btnThem.Text = "Thêm";
            frm.Show();
        }

        //Hàm sử lý sự kiện Cập nhật
        private void btnCapNhat_Click(object sender, EventArgs e)
        {
            if (dgvTKB.SelectedRows.Count > 0)
            {
                ql = new ThoiKhoaBieu();
                DataGridViewRow dgrow = dgvTKB.SelectedRows[0];

                ql.MaTKB = dgrow.Cells[0].Value.ToString();
                ql.MaLop = dgrow.Cells[1].Value.ToString();
                ql.MaMH = dgrow.Cells[2].Value.ToString();
                ql.MaGV = dgrow.Cells[3].Value.ToString();
                ql.Tuan = Convert.ToInt32(dgrow.Cells[4].Value.ToString());
                ql.NgayBatDau = Convert.ToDateTime(dgrow.Cells[5].Value.ToString());
                ql.NgayKetThuc = Convert.ToDateTime(dgrow.Cells[6].Value.ToString());
                ql.Thu = dgrow.Cells[7].Value.ToString();
                ql.Tiet = dgrow.Cells[8].Value.ToString();
                ql.Phong = dgrow.Cells[9].Value.ToString();

                var frm = new frmThemTKB(_manager, this, ql);
                frm.Text = "Cập nhật Thời khóa biểu";
                frm.btnThem.Text = "Cập nhật";
                frm.Show();
            }
            else MessageBox.Show("Vui lòng chọn TKB đề nghị để cập nhật", "Thông Báo");
        }

        private void btnXoa_Click(object sender, EventArgs e)
        {
            if (dgvTKB.SelectedRows.Count > 0)
            {
                if (MessageBox.Show("Bạn có muốn xóa TKB đề nghị đã chọn ?", "Xóa TKB đề nghị", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1) == DialogResult.Cancel)
                    return;
                foreach (DataGridViewRow row in dgvTKB.Rows)
                {
                    if (row.Selected)
                    {
                        var aResult = _manager.Delete(row.Cells[0].Value.ToString());
                        if (aResult.Success) MessageBox.Show("Xóa thành công");
                        else MessageBox.Show("Xóa không thành cống", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    }
                }
                dgvTKB.DataSource = _repository.GetAll().ToList();
            }
            else MessageBox.Show("Vui lòng chọn TKB đề nghị để xóa", "Thông Báo");
        }

        //Tìm kiếm theo tuần
        private void txtTuan_TextChanged(object sender, EventArgs e)
        {
            //Nếu người dùng nhập "0" thì load hết dữ liệu
            if (txtTuan.Text == "0" || txtTuan.Text == "")
                btnLamMoi.PerformClick();
            else
            {
                {
                    //Gọi hàm tìm kiếm và trả dữ liệu vào danh sách kết quả
                    List<ThoiKhoaBieu> dsTKB = ThoiKhoaBieu.Repository.Find(s => s.Tuan == Convert.ToInt32(txtTuan.Text)).ToList();
                if (dsTKB.Count > 0)

                    dgvTKB.DataSource = dsTKB;
                else
                    dgvTKB.DataSource = null;
                }
            }
        }

        

        private void btnThemTuFile_Click(object sender, EventArgs e)
        {
            String url;
            OpenFileDialog dl = new OpenFileDialog();
            //Lấy thông tin đường dẫn (URL) file excel
            url = dl.ShowDialog() == DialogResult.OK ? dl.FileName : "";
            //Kiểm tra có lấy được URL không
            if (!ValidInput())
                return;

            // Đọc dữ liệu từ tập tin excel trả về DataTable
            DataTable data = ReadDataFromExcelFile();

            // Import dữ liệu đọc được vào database
            ImportIntoDatabase(data);

            // Lấy hết dữ liệu import từ database hiển thị lên gridView
            btnLamMoi.PerformClick();

        }

        private bool ValidInput()
        {
            if (url == "")
            {
                MessageBox.Show("Xin vui lòng chọn tập tin excel cần import");
                return false;
            }
            return true;
        }

        private DataTable ReadDataFromExcelFile()
        {
            string connectionString = "Provider=Microsoft.Jet.OLEDB.12.0;Data Source=" + url.Trim() + ";Extended Properties=Excel 8.0";
            // Tạo đối tượng kết nối
            OleDbConnection oledbConn = new OleDbConnection(connectionString);
            DataTable data = null;
            try
            {
                // Mở kết nối
                oledbConn.Open();

                // Tạo đối tượng OleDBCommand và query data từ sheet có tên "Sheet1"
                OleDbCommand cmd = new OleDbCommand("SELECT * FROM [Sheet1$]", oledbConn);

                // Tạo đối tượng OleDbDataAdapter để thực thi việc query lấy dữ liệu từ tập tin excel
                OleDbDataAdapter oleda = new OleDbDataAdapter();

                oleda.SelectCommand = cmd;

                // Tạo đối tượng DataSet để hứng dữ liệu từ tập tin excel
                DataSet ds = new DataSet();

                // Đổ đữ liệu từ tập excel vào DataSet
                oleda.Fill(ds);

                data = ds.Tables[0];
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
            finally
            {
                // Đóng chuỗi kết nối
                oledbConn.Close();
            }
            return data;
        }

        private void ImportIntoDatabase(DataTable data)
        {
            if (data == null || data.Rows.Count == 0)
            {
                MessageBox.Show("Không có dữ liệu để import");
                return;
            }
            try
            {
                ThoiKhoaBieu tkb = new ThoiKhoaBieu();
                for (int i = 0; i < data.Rows.Count; i++)
                {
                    tkb.MaTKB = data.Rows[i]["MaTKB"].ToString().Trim();
                    tkb.MaLop = data.Rows[i]["MaLop"].ToString().Trim();
                    tkb.MaMH = data.Rows[i]["MaMH"].ToString().Trim();
                    tkb.MaGV = data.Rows[i]["MaGV"].ToString().Trim();
                    tkb.Tuan = int.Parse(data.Rows[i]["Tuan"].ToString().Trim());
                    tkb.NgayBatDau = DateTime.Parse(data.Rows[i]["NgayBatDau"].ToString().Trim());
                    tkb.NgayKetThuc = DateTime.Parse(data.Rows[i]["NgayKetThuc"].ToString().Trim());
                    tkb.Thu = data.Rows[i]["Thu"].ToString().Trim();
                    tkb.Tiet = data.Rows[i]["Tiet"].ToString().Trim();
                    tkb.Phong = data.Rows[i]["Phong"].ToString().Trim();

                    var vResult = _manager.Validate(tkb);
                    if (vResult.Valid)
                    {
                        var aResult = _manager.InsertOrUpdate(tkb);
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }

            MessageBox.Show("Thêm thành công!");
        }

        private void btnIn_Click(object sender, EventArgs e)
        {
            frmInThoiKhoaBieu inTKB = new frmInThoiKhoaBieu();
            inTKB.Show();
        }


    }
}
